<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>私有属性</title>
</head>
<body>
    
</body>
</html>

<script>
    //一句话   私有属性只有当前类能访问到  类外面不能访问
    //实例化也不行  想要获取私有属性   需要通过set get 来进行设置  或者公共方法
    // class User{
    //     //private
    //     #host = 'https://houdunren.com';
    //     constructor(name){
    //         this.name = name;
    //         //私有方法外部不能调用，但是到内部可以进行调用
    //         this.#check();
    //     }
    //     set host(url){
    //         if(!/^https?:/i.test(url)){
    //             throw new Error("不是正常的网址");
    //         }
    //         this.#host = url;
    //     }

    //     get host(){
    //         return this.#host;
    //     }

    //     //私有方法
    //     #check = () => {
    //         if(this.name.length <= 5){
    //             throw new Error("用户名长度不能小于五位");
    //         }
    //         return true;
    //     }
        
    // }

    // let hd = new User("后盾人在先教程");
    // hd.host = 'https://www.xiaobangcai.com';
    // console.log(hd.host);

    //属性保护
    //保护属性并使用访问器控制
    //声明一个对象  并且保护这个对象里面的属性  不被随意修改
    const protecteds = Symbol('protected');
    class User{
        constructor(name){
            this[protecteds] = {name:name};
        }
        get name(){
            return this[protecteds].name;
        }
        set name(value){
            if(value.trim() == '') throw new Error("invaild params");
            this[protecteds].name = value;
        }
    }

    let hd = new User("向军大叔");
    console.log(hd.name);
    hd.name = "后盾人";
    // console.log(hd.name);
    console.log(Object.keys(hd));
    

    
</script>